home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
gamesrc
/
arasan_s
/
pool.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-24
|
2KB
|
95 lines
// Copyright 1993 by Jon Dart. All Rights Reserved.
#include "pool.h"
Pool::Pool( const unsigned chunk_size )
{
my_chunk_size = chunk_size;
memChain = freeChunks = NULL;
nextMem = NULL;
freeChain = NULL;
}
void *Pool::allocate( size_t size )
{
if (!freeChain)
{
size += sizeof(void*);
if (!memChain ||
size >= (int)my_chunk_size - (nextMem - memChain->mem))
{
chunk *newChunk;
if (freeChunks)
{
newChunk = freeChunks;
freeChunks = freeChunks->next;
}
else
{
newChunk = new chunk;
newChunk->mem = new char[(unsigned int)my_chunk_size];
}
newChunk->next = memChain;
memChain = newChunk;
nextMem = newChunk->mem;
}
char *p = nextMem;
nextMem += size;
*((void**)p) = NULL;
return (void*)(p+sizeof(void*));
}
else
{
void **next = (void**)(freeChain);
void *p = (char*)(freeChain) + sizeof(void*);
freeChain = *next;
return p;
}
}
void Pool::free( void *p )
{
void *q = (void*)((char*)p-sizeof(void*));
*((void**)q) = freeChain;
freeChain = (void*)q;
}
void Pool::freeAll(Boolean final)
{
if (final)
{
// delete free chunks
chunk *c = freeChunks;
while (c)
{
chunk *nxt = c->next;
delete [] c->mem;
delete c;
c = nxt;
}
}
chunk *c = memChain;
while(c)
{
chunk *nxt = c->next;
if (final)
{
delete [] c->mem;
delete c;
}
else
{
c->next = freeChunks;
freeChunks = c;
}
c = nxt;
}
memChain = NULL;
nextMem = NULL;
freeChain = NULL;
if (final)
freeChunks = NULL;
}